package com.jqq.inner_;

public class AnonymousClassDetail {
    public static void main(String[] args) {
        Outer05 outer05 = new Outer05();
        outer05.f1();
        //外部其他类不能访问匿名内部类
    }
}
class Outer05{
    private int n1 = 99;
    public void f1(){
        int n1 = 100;
        //创建一个基于类的匿名内部类
        //不能添加访问修饰符，因为它的地位就是一个局部变量
        Person person = new Person(){
            @Override
            public void hi() {
                //可以直接访问外部类的所有成员，包含私有的
                System.out.println("匿名内部类重写的hi()"+n1);
                //默认就近原则 如果想访问外部类的成员，就可以使用外部类名.this.成员去访问
                System.out.println("外部类的n1"+Outer05.this.n1);
            }
        };
        //作用域：仅仅在定义它的方法或代码块中
        person.hi();//动态绑定 真实运行类型Outer05$1
        System.out.println(person.getClass());

        //也可以直接调用
        //因为匿名内部类本身也是返回对象
        new Person(){
            @Override
            public void hi() {
                System.out.println("匿名内部类的第二个hi()");
            }

            @Override
            void ok(String str) {
                super.ok(str);
            }
        }.ok("jack");
    }
}



class Person{
    public void hi(){
        System.out.println("Person hi()");
    }
    void ok(String str){
        System.out.println("Person  ok~"+str);
    }
}